using System;
using System.Collections.Generic;
using System.Text;
using MySql.Data.MySqlClient;
using System.Data;
using NEX_Datos;


namespace NEXServicio
{
    public class ServicioLibro : ServicioPadre
    {
        #region Constantes
        public const String DataTableName = "Libro";
        #endregion

        #region Metodos Privados
        private static DataSet ListarPrivado(bool? activo, String titulo, int? idAutor, int? idCategoria, int? idTema)
        {
            DataSet ds = new DataSet();
            ds.Locale = System.Globalization.CultureInfo.CurrentCulture;
            using (MySqlCommand cmd = UtilidadAD.CreateSqlCommand())
            {
                cmd.CommandText = "LibroTraer";
                SeteaValorNulo("p_idLibro", cmd, MySqlDbType.Int32);
                SetearConNulo("p_activo", cmd, MySqlDbType.Bit, activo);
                SetearConNulo("p_titulo", cmd, MySqlDbType.VarChar, titulo);
                SetearConNulo("p_idAutor", cmd, MySqlDbType.Int32, idAutor);
                SetearConNulo("p_idCategoria", cmd, MySqlDbType.Int32, idCategoria);
                SetearConNulo("p_idTema", cmd, MySqlDbType.Int32, idTema);
                
                using (MySqlDataAdapter da = new MySqlDataAdapter(cmd))
                {
                    da.Fill(ds);
                }
                cmd.Connection.Close();
            }
            ds.Tables[0].TableName = ServicioLibro.DataTableName;
            return ds;
        }
        private static DataSet ListarPaginadosPrivado(bool? activo, String titulo, int? idAutor, int? idCategoria, int? idTema,int? pagina,int? cantidad)
        {
            DataSet ds = new DataSet();
            ds.Locale = System.Globalization.CultureInfo.CurrentCulture;
            using (MySqlCommand cmd = UtilidadAD.CreateSqlCommand())
            {
                cmd.CommandText = "LibroPaginarTraer";
                SeteaValorNulo("p_idLibro", cmd, MySqlDbType.Int32);
                SetearConNulo("p_activo", cmd, MySqlDbType.Bit, activo);
                SetearConNulo("p_titulo", cmd, MySqlDbType.VarChar, titulo);
                SetearConNulo("p_idAutor", cmd, MySqlDbType.Int32, idAutor);
                SetearConNulo("p_idCategoria", cmd, MySqlDbType.Int32, idCategoria);
                SetearConNulo("p_idTema", cmd, MySqlDbType.Int32, idTema);
                SetearConNulo("p_registro", cmd, MySqlDbType.Int32, pagina);
                SetearConNulo("p_cantidad", cmd, MySqlDbType.Int32, cantidad);

                using (MySqlDataAdapter da = new MySqlDataAdapter(cmd))
                {
                    da.Fill(ds);
                }
                cmd.Connection.Close();
            }
            ds.Tables[0].TableName = ServicioLibro.DataTableName;
            return ds;
        }
        #endregion

        #region Metodos Publicos
        public static DataSet Obtener(int idLibro, Guid guidLibro)
        {
            DataSet ds = new DataSet();
            ds.Locale = System.Globalization.CultureInfo.CurrentCulture;
            using (MySqlCommand cmd = UtilidadAD.CreateSqlCommand())
            {
                cmd.CommandText = "LibroTraer";
                SetearConNulo("p_idLibro", cmd, MySqlDbType.Int32, idLibro);
                SeteaValorNulo("p_Activo", cmd, MySqlDbType.Bit);
                SeteaValorNulo("p_Titulo", cmd, MySqlDbType.VarChar);
                SeteaValorNulo("p_IdAutor", cmd, MySqlDbType.Int32);
                SeteaValorNulo("p_idCategoria", cmd, MySqlDbType.Int32);
                SeteaValorNulo("p_idTema", cmd, MySqlDbType.Int32);

                using (MySqlDataAdapter da = new MySqlDataAdapter(cmd))
                {
                    da.Fill(ds);
                }
                cmd.Connection.Close();
            }
            ds.Tables[0].TableName = ServicioLibro.DataTableName;

            return ds;
        }

        public static DataSet Listar()
        {
            return ServicioLibro.ListarPrivado(null, null, null,null,null);
        }
        public static DataSet Listar(Boolean activo)
        {
            return ServicioLibro.ListarPrivado(activo, null, null,null,null);
        }
        public static DataSet Listar(string titulo)
        {
            return ServicioLibro.ListarPrivado(null, titulo, null,null,null);
        }
        public static DataSet Listar(int idAutor)
        {
            return ServicioLibro.ListarPrivado(null, null, idAutor,null,null);
        }

        public static DataSet Listar(int? idAutor,string titulo)
        {
            return ServicioLibro.ListarPrivado(null, titulo, idAutor,null,null);
        }

        public static DataSet ListarPaginar(int registro,int cantidadReg)
        {
            return ServicioLibro.ListarPaginadosPrivado(null, null, null, null, null,registro,cantidadReg);
        }
        public static DataSet ListarPaginar(int? idAutor,string titulo,int registro, int cantidadReg)
        {
            return ServicioLibro.ListarPaginadosPrivado(null, titulo, idAutor, null, null, registro, cantidadReg);
        }
        #endregion

        #region Metodos para Salvar
        public static int Salvar(Transaccion transaccion, int idLibro, String titulo, String tituloOriginal, int idAutor, String resumen, int idCategoria, DateTime? fechaPublicacion, Int32? anioPublicacion, bool activo, bool esInsert)
        {
            if (transaccion == null)
            {
                throw new ArgumentNullException("transaccion");
            }
            using (MySqlCommand cmd = transaccion.SqlCommandObtener())
            {
                cmd.CommandText = "LibroSalvar";
                cmd.Parameters.Add("p_idLIbro", MySqlDbType.Int32).Value = idLibro;
                cmd.Parameters["p_idLIbro"].Direction = ParameterDirection.InputOutput;
                cmd.Parameters.Add("p_titulo", MySqlDbType.VarChar).Value = titulo;
                cmd.Parameters.Add("p_tituloOriginal", MySqlDbType.VarChar).Value = tituloOriginal;
                cmd.Parameters.Add("p_descripcion", MySqlDbType.Text).Value = resumen;
                SeteaValorNulo("p_isbn", cmd, MySqlDbType.VarChar);
                cmd.Parameters.Add("p_idAutor", MySqlDbType.Int32).Value = idAutor;
                cmd.Parameters.Add("p_idCategoria", MySqlDbType.Int32).Value = idCategoria;
                SetearConNulo("p_fechaPublicacion",cmd,MySqlDbType.DateTime,fechaPublicacion);
                SetearConNulo("p_anioPublicacion", cmd, MySqlDbType.Int32, anioPublicacion);
                cmd.Parameters.Add("p_activo", MySqlDbType.Bit).Value = activo;
                cmd.Parameters.Add("p_esAlta", MySqlDbType.Bit).Value = esInsert;
/*                SeteaValorNulo("p_fechaPublicacion", cmd, MySqlDbType.DateTime);*/
                
                cmd.ExecuteNonQuery();
                return (Int32)cmd.Parameters["p_IdLibro"].Value;
            }
        }
        #endregion

        #region Metodos para Eliminar
        public static bool Eliminar(Transaccion transaccion, Int32 idLibro)
        {
            if (transaccion == null)
            {
                throw new ArgumentNullException("transaccion");
            }
            using (MySqlCommand cmd = transaccion.SqlCommandObtener())
            {
                cmd.CommandText = "LibroEliminar";
                cmd.Parameters.Add("p_IdLibro", MySqlDbType.Int32).Value = idLibro;
                return (Convert.ToInt32(cmd.ExecuteScalar().ToString(), System.Globalization.CultureInfo.CurrentCulture) > 0);
            }
        }
        #endregion
    }
}
